/* 
全局 JWT 鉴权 中间件
*/
module.exports = (options, app) => {

  return async function(ctx, next){

    // 当前访问的路径
    // let pathURL = ctx.originalUrl;
    let pathURL = ctx.path;

    // 获取请求头部的JWT
    let token = ctx.request.header.authorization;

    // 判断头部是否携带token 
   /*  if(!token || token === ''){
      ctx.body = {
        code: 401,
        message: '用户令牌没有携带'
      }
      return;
    } */

    // 注册通行路径 免JWT验证的路径 如: 登录首页
    let passPaths = ['/jwt/login','/system/user/login','/verifycode','/hello/login','/emp/verifycode'];
    if(passPaths.some( val => pathURL === val)){
      await next();
      return;
    }

/* 

    if(pathURL === '/jwt/login'){
      await next();
      return;
    } */

    // 解码jwt try catch 语句块可以捕获 token没有携带、toekn过期、token 格式不正确
    let jwtObject = null;
    try{
      jwtObject = await app.jwt.verify(token,app.config.jwt.secret);
    }catch(err){
      ctx.body = {
        code: 403,
        name: `${err.name}`,
        message: `${err.message}`
      }
      return;
    }
    

    // token 对象无法解析
    if(!jwtObject){
      ctx.body={
        code: 403,
        message: 'token 不正确！'
      }
    }
   
    // 1.判断该账号是否存在
    let accountFlag = await ctx.service.dbSer.verifyAccount(jwtObject.dname);
    if(!accountFlag ){
      ctx.body = {
        code: 401,
        message: '该账号不存在!'
      }
    }


    // 2、根据JWT中角色 判断路由是否有访问权限
    let result = await ctx.service.dbSer.queryRoutersByRole(jwtObject.role);
    if(!result || result.length === 0){
        ctx.body = {
          code: 403,
          message: '该角色不存在!'
        }
    }

    // 取出结果集中的rpath 路由路径
    let rolesRouters = result[0].rpath;
    
    // val 表示 当前角色 所拥有的的路径
    let pathFlag = rolesRouters.split(',').some(val=>{
      return pathURL === val;
    });

    if(!pathFlag){
      ctx.body = {
        code: 403,
        message: '该角色权限不足!'
      }
      return;
    }

    // 3、令牌(token)是否过期
   /*  let expFlag = await ctx.service.custjwtSer.vreifyTokenExp(jwtObject.exp);
    if(!expFlag){
      ctx.body = {
        code: 304,
        message: '该token已过期!'
      }
      return;
    } */

    // 验证token 通过
    await next();
  }
}